package aiP.A3.UPPSAdapter;

import aiP.A3.AuftragKomponente.DataAccessLayer.Entity.Angebot;
import aiP.A3.BuchhaltungKomponente.DataAccessLayer.Entity.Kunde;
import aiP.A3.FertigungKomponente.DataAccessLayer.Entity.Bauteil;
import aiP.A3.MPS.Interfaces.IServerInstance;
import aiP.A3.MPS.ServerInstance;
import aiP.A3.VersandKomponente.DataAccessLayer.DTO.TransportauftragDTO;
import aiP.A3.VersandKomponente.DataAccessLayer.Entity.Transportauftrag;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * User: mizus
 * Date: 12.06.14
 * Time: 15:10
 * To change this template use File | Settings | File Templates.
 */
public class TransportAdapter implements ITransport_Adapter {

    private static final String STANDARD_URL ="http://localhost:8080";
    private static final String SEND_URL = "/Versanddienstleister/versand/creates";




    public TransportAdapter(ServerInstance aDispatcher){
        instance = aDispatcher;
    }

    private ServerInstance instance;

    @Override
    public TransportauftragDTO createTransportAuftrag(Transportauftrag trans) throws RemoteException, NotBoundException {
        TransportauftragDTO result = new TransportauftragDTO();
        result.setAuftragsID(trans.getAuftragsnr());

        Collection<Angebot> angebotSet = instance.getAngebotCol(instance.getAuftragsMapCol().get(result.getAuftragsID()).getAngebotsnr());

        Map<Integer, Bauteil> map_bauteil = instance.getBautei_Id();
        Set<Bauteil> volumen_Set = new HashSet<Bauteil>();
        double gesamtPreis = 0;
        int kundenID = -1;
        for (Angebot elem: angebotSet){
            volumen_Set.add(map_bauteil.get(elem.getBauteilNr()));
            gesamtPreis += map_bauteil.get(elem.getBauteilNr()).getPreis().doubleValue();
            kundenID = elem.getKundenNr();
        }
        result.setAuftragsVolumen(volumen_Set);
        result.setGesamtpreis(gesamtPreis);
        Map<Integer, Kunde> map_Kunde = instance.getKundenMapByID();

        result.setKundenName(map_Kunde.get(kundenID).getName());
        result.setAnschrift(map_Kunde.get(kundenID).getAnschrift());

        return result;
    }

    @Override
    public boolean postToUpps(TransportauftragDTO trans) throws IOException {
        System.out.println("Versand an Upps vorbereiten");
        URL postURL = new URL(STANDARD_URL + SEND_URL);

        HttpURLConnection connection = (HttpURLConnection) postURL.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");

        String toSend = "{" + trans.toString() + "}";

        OutputStream os = connection.getOutputStream();
        os.write(toSend.getBytes());
        os.flush();

        if (connection.getResponseCode() != HttpURLConnection.HTTP_ACCEPTED){
            return false;
        }
        String outPut;
        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        System.out.println("gesendet an UPPS");
        while ((outPut = br.readLine()) != null){
            System.out.println("===> " + outPut);
        }
        connection.disconnect();
        return true;
    }


}
